public class ThresholdCalculator {

    // *
    // Otsu 阈值分割算法（大津算法） 的核心逻辑。
    // 该方法用于计算图像二值化时的最佳阈值（threshold），使得图像被分为前景和背景两部分，且这两部分之间的类间方差最大。
    // Otsu 算法是一种基于图像灰度直方图的自动阈值选择方法。其核心思想是：
    // 遍历所有可能的灰度值（0~255），尝试将图像分成两类：背景（小于当前灰度值）和前景（大于等于当前灰度值）。
    // 计算每一类的权重（像素数量占比）和均值。
    // 计算类间方差（between-class variance）。
    // 找出使类间方差最大的灰度值作为最优阈值。
    //
    public static int otsuThreshold(int[] histogram) {
        int total = 0;
        for (int count : histogram) {
            total += count;
        }

        float sum = 0;
        for (int i = 0; i < 256; ++i) {
            sum += i * histogram[i];
        }

        float wB = 0;
        float wF = 0;

        float maxVariance = 0;
        int threshold = 0;

        float sumB = 0;
        for (int i = 0; i < 256; ++i) {
            wB += histogram[i];
            if (wB == 0)
                continue;
            wF = total - wB;

            sumB += i * histogram[i];
            float meanB = sumB / wB;
            float meanF = (sum - sumB) / wF;

            float variance = wB * wF * (meanB - meanF) * (meanB - meanF);
            if (variance > maxVariance) {
                maxVariance = variance;
                threshold = i;
            }
        }

        return threshold;
    }
}